/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package baseDatos;

import entidades.DetalleEnfermedad;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Facundo
 */
public class DetalleEnfermedadDAO {

    private String query;
    private Connection conDB;
    private PreparedStatement pst;

    public DetalleEnfermedadDAO(Connection con) {
        this.conDB = con;
    }

    public DetalleEnfermedadDAO() {
    }

    /**
     * @return the query
     */
    public String getQuery() {
        return query;
    }

    /**
     * @param query the query to set
     */
    public void setQuery(String query) {
        this.query = query;
    }

    /**
     * @return the conDB
     */
    public Connection getConDB() {
        return conDB;
    }

    /**
     * @param conDB the conDB to set
     */
    public void setConDB(Connection conDB) {
        this.conDB = conDB;
    }

    /**
     * @return the pst
     */
    public PreparedStatement getPst() {
        return pst;
    }

    /**
     * @param pst the pst to set
     */
    public void setPst(PreparedStatement pst) {
        this.pst = pst;
    }

    /*
     * Metodo para insertar un detalle de enfermedad
     * Recibe por parametro un objeto Detalle de enfermedad
     * El detalle se inserta en la base con los siguientes datos:
     * codigo_detalle
     * fecha_deteccion
     * fecha_curacion
     * observaciones
     * codigo_enfermedad
     * codigo_historial
     * codigo_curacion
     */
    public boolean put(DetalleEnfermedad detalle, int codigoHistorial) {
        boolean ret = false;
        try {
            /*
             * buscamos el numero del ultimo detalle de enfermedad registrado y le sumamos uno
             */
            int codigoDetalleEnfermedad = this.getUltimoCodigoDetEnfermedad() + 1;
            /*
             * buscamos el codigo de la enfermedad
             */
            int codigoEnfermedad = new EnfermedadDAO(this.getConDB()).devolverCodigoEnfermedad(detalle.getEnfermedad().getNombre());
            /*
             * bsucamos el codigo de la curacion
             */
            int codigoCuracion = -1;
            if (detalle.getCuracion() != null) {
                codigoCuracion = new CuracionDAO(this.getConDB()).devolverCodigoCuracion(detalle.getCuracion().getNombre());
            }
            /*
             * Manejamos la fecha de deteccion y la fecha de curacion
             */
            String fecha = detalle.getFecha_deteccion().toString();
            String fecha_dia = fecha.substring(8);
            String fecha_año = fecha.substring(0, 4);
            String fecha_mes = fecha.substring(5, 7);
            /*
             * si este detalle tiene una fecha de curacion y un objeto curacion se insertan con estos
             * prametros. Caso contrario, se inserta si la curacion
             */
            if (detalle.getFecha_curacion() != null && codigoCuracion != -1) {
                String fecha2 = detalle.getFecha_curacion().toString();
                String fecha_dia2 = fecha2.substring(8);
                String fecha_año2 = fecha2.substring(0, 4);
                String fecha_mes2 = fecha2.substring(5, 7);

                setQuery("insert into PC_DETALLE_ENFERMEDAD (codigo_detalle,codigo_curacion,codigo_historial,codigo_enfermedad,fecha_curacion,fecha_deteccion,observaciones)"
                        + " values (" + codigoDetalleEnfermedad + "," + codigoCuracion + "," + codigoHistorial
                        + "," + codigoEnfermedad + ",'" + fecha_año2 + "-" + fecha_dia2 + "-" + fecha_mes2 + "'," + ",'" + fecha_año + "-" + fecha_dia + "-" + fecha_mes + "','"
                        + detalle.getObservaciones() + "');");
            } else {
                setQuery("insert into PC_DETALLE_ENFERMEDAD (codigo_detalle,codigo_historial,codigo_enfermedad,fecha_deteccion,observaciones)"
                        + " values (" + codigoDetalleEnfermedad + "," + codigoHistorial
                        + "," + codigoEnfermedad + ",'" + fecha_año + "-" + fecha_dia + "-" + fecha_mes + "','"
                        + detalle.getObservaciones() + "');");
            }

            setPst(getConDB().prepareStatement(getQuery()));
            ret = getPst().execute();
            getPst().close();
            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DetalleEnfermedadDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    public boolean nuevoPut(DetalleEnfermedad detalle, int codHistorial){
        boolean res=false;
        int codigoDetalleEnfermedad = this.getUltimoCodigoDetEnfermedad() + 1;
        int codigoEnfermedad = new EnfermedadDAO(this.getConDB()).devolverCodigoEnfermedad(detalle.getEnfermedad().getNombre());
        String sql="insert into PC_DETALLE_ENFERMEDAD (codigo_detalle, codigo_historial, codigo_enfermedad,fecha_deteccion,observaciones) "
                + " values ("+ codigoDetalleEnfermedad+","+ codHistorial+","+codigoEnfermedad+",to_date('" + detalle.getFecha_deteccion().dateValue() + "','yyyy/MM/DD HH:MI'),"+detalle.getObservaciones()+")";
        System.out.println("Sentencia que inserta en pc_detalle_enfermedad: "+sql);
        return res;
    }

    /*
     * Metodo para actualizar un detalle de enfermedad. Se registra la curacion de esa enfermedad.
     * Los campos que se actualizan son el codigo de la curacion y la fecha de curacion
     * Se recibe como parametro el objeto detalleEnfermedad y el codigo del historial
     */
    public boolean updateCuracion(DetalleEnfermedad detalle, int codigoHistorial) {
        boolean ret = false;
        try {
            /*
             * obtenemos el codigo de la enfermedad
             */
            int codigoEnfermedad = new EnfermedadDAO(this.getConDB()).devolverCodigoEnfermedad(detalle.getEnfermedad().getNombre());
            /*
             * obtenemos el codigo del detalle que debemos actualizar
             */
            int codigoDetalle = this.getCodigoDetalleEnfermedad(codigoHistorial, codigoEnfermedad);
            /*
             * bsucamos el codigo de la curacion
             */
            int codigoCuracion = new CuracionDAO(this.getConDB()).devolverCodigoCuracion(detalle.getCuracion().getNombre());

            /*
             * Manejamos la fecha de curacion
             */
            String fecha = detalle.getFecha_curacion().toString();
            String fecha_dia = fecha.substring(8);
            String fecha_año = fecha.substring(0, 4);
            String fecha_mes = fecha.substring(5, 7);
            setQuery("update PC_DETALLE_ENFERMEDAD set codigo_curacion=" + codigoCuracion
                    + ", fecha_curacion='" + fecha_año + "-" + fecha_dia + "-" + fecha_mes + "' "
                    + " where codigo_detalle=" + codigoDetalle + ");");
            setPst(getConDB().prepareStatement(getQuery()));
            ret = getPst().execute();
            getPst().close();
            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DetalleEnfermedadDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    /*
     * Metodo que devuelve un detalle de enfermedad de acuerdo al codigo del historial del mismo y el
     * el codigo de la enfermedad recibido por parametro.
     * Ya que cada historial puede tener una sola muerte
     */
    public DetalleEnfermedad getDetalleEnfermedad(int codigoHistorial, int codigoEnfermedad) {
        DetalleEnfermedad detalle = null;
        setQuery("select * from PC_DETALLE_ENFERMEDAD where codigo_historial=" + codigoHistorial + " and codigo_enfermedad=" + codigoEnfermedad);
        detalle = this.devolverDetalleEnfermedad(getQuery());
        return detalle;
    }

    /*
     * Metodo que devuelve un detalle de enfermedad de acuerdo al codigo del mismo recibido por parametro
     */
    public DetalleEnfermedad getDetalleEnfermedad(int codigo) {
        DetalleEnfermedad detalle = null;
        setQuery("select * from PC_DETALLE_ENFERMEDAD where codigo_detalle=" + codigo);
        detalle = this.devolverDetalleEnfermedad(getQuery());
        return detalle;
    }

    /*
     * Metodo que devuelve un detalle de enfermedad de acuerdo a la sentencia recibida por parametro
     */
    private DetalleEnfermedad devolverDetalleEnfermedad(String sentencia) {
        DetalleEnfermedad detalle = null;
        ResultSet rs = null;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                detalle = new DetalleEnfermedad();
//                detalle.setFecha_deteccion(rs.getDate("fecha_deteccion"));
//                if (rs.getDate("fecha_curacion") != null) {
//                    detalle.setFecha_curacion(rs.getDate("fecha_curacion"));
//                }
                if (rs.getString("observaciones") != null) {
                    detalle.setObservaciones(rs.getString("observaciones"));
                }
                detalle.setEnfermedad(new EnfermedadDAO(this.getConDB()).getEnfermedad(rs.getInt("codigo_enfermedad")));
                if (String.valueOf(rs.getInt("codigo_curacion")) != null) {
                    detalle.setCuracion(new CuracionDAO(this.getConDB()).getCuracion(rs.getInt("codigo_curacion")));
                }
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(DetalleEnfermedadDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return detalle;
    }

    /*
     * Metodo que devuelve un ArrayList con un detalle de enfermedad de acuerdo al codigo del historial del
     * mismo recibido por parametro.
     */
    public ArrayList getDetalleEnfermedades(int codigoHistorial) {
        ArrayList detalle = null;
        setQuery("select * from PC_DETALLE_ENFERMEDAD where codigo_historial=" + codigoHistorial);
        detalle = this.devolverDetalleEnfermedades(getQuery());
        return detalle;
    }

    /*
     * Metodo que devuelve un array de detalles de enfermedades de acuerdo a la sentencia recibida por parametro
     */
    private ArrayList devolverDetalleEnfermedades(String sentencia) {
        ArrayList lista = null;
        DetalleEnfermedad detalle = null;
        ResultSet rs = null;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            lista = new ArrayList();
            while (rs.next()) {
                detalle = new DetalleEnfermedad();
//                detalle.setFecha_deteccion(rs.getDate("fecha_deteccion"));
//                if (rs.getDate("fecha_curacion") != null) {
//                    detalle.setFecha_curacion(rs.getDate("fecha_curacion"));
//                }
                if (rs.getString("observaciones") != null) {
                    detalle.setObservaciones(rs.getString("observaciones"));
                }
                detalle.setEnfermedad(new EnfermedadDAO(this.getConDB()).getEnfermedad(rs.getInt("codigo_enfermedad")));
                if (String.valueOf(rs.getInt("codigo_curacion")) != null) {
                    detalle.setCuracion(new CuracionDAO(this.getConDB()).getCuracion(rs.getInt("codigo_curacion")));
                }
                lista.add(detalle);
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(DetalleEnfermedadDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return lista;
    }


    /*
     * Metodo que devuelve el codigo de un detalle de enfermedad registrado en la base. Recibe como parametro
     * un codigo de historial y codigo de enfermedad y retorna el codigo.
     */
    public int getCodigoDetalleEnfermedad(int codigoHistorial, int codigoEnfermedad) {
        setQuery("select codigo_detalle from PC_DETALLE_ENFERMEDAD where codigo_historial=" + codigoHistorial + " and codigo_enfermedad=" + codigoEnfermedad);
        int codigo = this.devolverCodigoDetalleEnfermedad(getQuery());
        return codigo;

    }

    /*
     * Metodo que devuelve el codigo del ultimo detalle de enfermedad registrado en la base
     */
    public int getUltimoCodigoDetEnfermedad() {
        setQuery("select MAX(codigo_detalle) AS codigo_detalle from PC_DETALLE_ENFERMEDAD");
        int codigo = this.devolverCodigoDetalleEnfermedad(getQuery());
        return codigo;

    }

    /*
     * Metodo que devuelve el codigo de un detalle de muerte, de acuerdo a la sentencia recibida por parametro
     */
    private int devolverCodigoDetalleEnfermedad(String sentencia) {
        int codigo = -1;
        ResultSet rs = null;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                codigo = rs.getInt("codigo_detalle");
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(DetalleEnfermedadDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return codigo;
    }
}
